#include "stm32f10x.h"


int main(void)
{
#if 0
	// 这是对单片机的led2的点亮，为单片机的pc13口
	// 1.时钟配置
	// RCC寄存器的基地址 0x4002 1000  APB2偏移地址 0x18，使能GPIOC时钟
	*(uint32_t *) (0x40021000 + 0x18) = 0x10;
	// 2.GPIO工作模式配置
	// GPIOC的基地址 0x4001 1000
	*(uint32_t *) (0x40011000 + 0x04) = 0x44344444;
	// 3.PC13输出低电平
	*(uint32_t *) (0x40011000 + 0x0c) = 0xdfff;
	// 4.用一个死循环保持状态
	while (1)
	{}

#endif

#if 0
	// 1.时钟配置
	// RCC寄存器的基地址 0x4002 1000  APB2偏移地址 0x18，使能GPIOA的时钟
	*(uint32_t *) (0x40021000 + 0x18) = 0x4;
	// 2.GPIO工作模式配置
	// GPIOA的基地址 0x4001 0800，配置PA1/PA2/PA3的输出模式
	*(uint32_t *) (0x40010800 + 0x00) = 0x44443334;
	// 3.PA1/PA2/PA3输出低电平
	*(uint32_t *) (0x40010800 + 0x0c) = 0xfff1;
	// 4.用一个死循环保持状态
	while (1)
	{}
#endif

#if 1
	// 对地址进行优化，使用宏定义
	// 1.时钟配置
	// RCC寄存器的基地址 0x4002 1000  APB2偏移地址 0x18，使能GPIOA的时钟
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

	// 2.GPIO工作模式配置
	// GPIOA的基地址 0x4001 0800，配置PA1/PA2/PA3的 0011 输出模式
	// PA1的配置
	GPIOA->CRL &= ~GPIO_CRL_CNF1;
	GPIOA->CRL |= GPIO_CRL_MODE1;
	// PA2的配置
	GPIOA->CRL &= ~GPIO_CRL_CNF2;
	GPIOA->CRL |= GPIO_CRL_MODE2;
	// PA3的配置
	GPIOA->CRL &= ~GPIO_CRL_CNF3;
	GPIOA->CRL |= GPIO_CRL_MODE3;

	// 3.PA1/PA2/PA3输出低电平
	GPIOA->ODR &= ~(GPIO_ODR_ODR1 | GPIO_ODR_ODR2 | GPIO_ODR_ODR3);
	// 4.用一个死循环保持状态
	while (1)
	{}
#endif
}
